package com.cs.code.util;

import com.cs.code.exception.CodeException;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.FileWriter;
import java.io.IOException;
import java.util.Map;
import java.util.Properties;

/**
 * @package com.cs.code.util
 * @class FtlUtil
 * @desc freemarker模板
 * @author wind
 * @date    2023/9/18 18:26
 * @version v1.0
 */
public class VmUtil {

    private static final Logger LOGGER = LoggerFactory.getLogger(VmUtil.class);

    private VmUtil(){

    }

    /**
     * 根据模板生成文件
     * @param name 模板文件名称
     * @param filename 生成文件名称
     * @param data 模板替换数据
     */
    public static void out(String name, String filename, Map<String, Object> data){
        out(null, name, filename, data);
    }

    /**
     * 根据模板生成文件
     * @param dir 模板文件目录
     * @param name 模板文件名称
     * @param filename 生成文件名称
     * @param data 模板替换数据
     */
    public static void out(String dir, String name, String filename, Map<String, Object> data){
        try {
            //设置velocity资源加载器
            Properties prop = new Properties();
            if(dir == null || "".equals(dir) || "/".equals(dir)){
                prop.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
            }else{
                prop.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.FileResourceLoader");
                prop.put("resource.loader.file.path", dir);
            }
            Velocity.init(prop);
            //创建Velocity容器
            VelocityContext context = new VelocityContext();
            if(data != null){
                data.forEach(context::put);
            }
            //加载模板
            org.apache.velocity.Template tpl = Velocity.getTemplate(name, "UTF-8");

            FileWriter fw  = new FileWriter(filename);
            //合并数据到模板
            tpl.merge(context, fw);
            //释放资源
            fw.close();
        } catch (IOException e) {
            LOGGER.error("VmUtil.out failed", e);
            throw new CodeException(e);
        }
    }
}
